// model包定义了应用程序的核心业务模型和接口
package model

import (
	"context"
	"time"
)

const (
	// TableTask SQLite中任务表的名称
	TableTask = "tasks"
)

// Task 任务领域模型
// 定义任务的核心属性和行为
type Task struct {
	ID        uint      `gorm:"primaryKey" json:"id"`                                  // 任务唯一标识符, 自增ID
	Title     string    `gorm:"not null" form:"title" binding:"required" json:"title"` // 任务标题, 表单绑定字段, 必填
	UserID    uint      `gorm:"not null;index" json:"-"`                               // 任务所属用户ID, 建立索引, 不在JSON中返回
	CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"`                       // 创建时间
	UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updatedAt"`                       // 更新时间
}

// TaskRepository 任务仓储接口
// 定义对任务数据的存储和检索操作, 具体实现在repository层
type TaskRepository interface {
	// Create 创建新任务
	Create(c context.Context, task *Task) error
	// FetchByUserID 获取指定用户的所有任务
	FetchByUserID(c context.Context, userID uint) ([]Task, error)
}

// TaskService 任务用例接口
// 定义任务相关的业务逻辑操作, 是应用服务层对领域模型行为的封装
type TaskService interface {
	// Create 创建新任务的业务逻辑
	Create(c context.Context, task *Task) error
	// FetchByUserID 获取用户任务列表的业务逻辑
	FetchByUserID(c context.Context, userID uint) ([]Task, error)
}
